Los principales objetivos de este ejercicio fueron crear y completar la GDT, pasar a modo protegido
y preparar la pantalla.

\subsubsection{GDT}
El archivo {\bf gdt.c} contiene el c\'odigo para inicializar la GDT.
\\
\hspace*{10pt}
Tal como ped\'ia la consigna, las primeras 10 entradas (0 a 9) fueron dejadas libres.
Las entradas n\'umero 10 y 12 fueron utilizadas para mapear el c\'odigo y los datos de nivel 0
respectivamente, mientras que las entradas n\'umero 11 y 13 fueron utilizadas para el c\'odigo y los
datos de nivel 3. Finalmente, la entrada 14 fue utilizada para mapear los datos de video, de nivel 0.
\\
\hspace*{10pt}
A continuaci\'on mostramos el contenido de los descriptores.

\begin{table}[H]
\centering
\scalebox{0.8}{
	\begin{tabular}{|c c c c c c c c|c|c|c|c|c c c c|c|c c|c|c c c c|c c c c c c c c|}
		\hline
		\multicolumn{4}{|l}{31} & \multicolumn{4}{r|}{24} &
		\multicolumn{2}{|l}{23} & \multicolumn{2}{r|}{20} &
		\multicolumn{2}{|l}{19} & \multicolumn{2}{r|}{16} &
		\multicolumn{2}{|l}{15} & \multicolumn{2}{r|}{12} &
		\multicolumn{2}{|l}{11} & \multicolumn{2}{r|}{8} &
		\multicolumn{4}{|l}{7} & \multicolumn{4}{r|}{0} \\
		\hline
		0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &
		1 & 1 & 0 & 0 &
		0 & 1 & 1 & 1 &
		1 & 0 & 0 & 1 &
		1 & 0 & 1 & 0 &
		0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
		\hline
		\multicolumn{8}{|c|}{Base address (24-31)} &
		\multicolumn{1}{|c|}{G} &
		\multicolumn{1}{|c|}{DB} &
		\multicolumn{1}{|c|}{} &
		\multicolumn{1}{|c|}{A} &
		\multicolumn{4}{|c|}{Limit (16-19)} &
		\multicolumn{1}{|c|}{P} &
		\multicolumn{2}{|c|}{DPL} &
		\multicolumn{1}{|c|}{S} &
		\multicolumn{4}{|c|}{Type} &
		\multicolumn{8}{|c|}{Base address (16-23)} \\
		\hline
		0 & 0 & 0 & 0 & 0 & 0 & 0 & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & 0 &
		\multicolumn{1}{|c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} &
		\multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} &
		1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\
		\hline
		\multicolumn{16}{|c|}{Base address (Bit 0-15)} &
		\multicolumn{16}{|c|}{Segment Limit (Bit 0-15)} \\
		\hline
	\end{tabular}
}
\caption{Descriptor de segmento para c\'odigo de nivel 0.}
\end{table}

\begin{table}[H]
\centering
\scalebox{0.8}{
	\begin{tabular}{|c c c c c c c c|c|c|c|c|c c c c|c|c c|c|c c c c|c c c c c c c c|}
		\hline
		\multicolumn{4}{|l}{31} & \multicolumn{4}{r|}{24} &
		\multicolumn{2}{|l}{23} & \multicolumn{2}{r|}{20} &
		\multicolumn{2}{|l}{19} & \multicolumn{2}{r|}{16} &
		\multicolumn{2}{|l}{15} & \multicolumn{2}{r|}{12} &
		\multicolumn{2}{|l}{11} & \multicolumn{2}{r|}{8} &
		\multicolumn{4}{|l}{7} & \multicolumn{4}{r|}{0} \\
		\hline
		0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &
		1 & 1 & 0 & 0 &
		0 & 1 & 1 & 1 &
		1 & 1 & 1 & 1 &
		1 & 0 & 1 & 0 &
		0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
		\hline
		\multicolumn{8}{|c|}{Base address (24-31)} &
		\multicolumn{1}{|c|}{G} &
		\multicolumn{1}{|c|}{DB} &
		\multicolumn{1}{|c|}{} &
		\multicolumn{1}{|c|}{A} &
		\multicolumn{4}{|c|}{Limit (16-19)} &
		\multicolumn{1}{|c|}{P} &
		\multicolumn{2}{|c|}{DPL} &
		\multicolumn{1}{|c|}{S} &
		\multicolumn{4}{|c|}{Type} &
		\multicolumn{8}{|c|}{Base address (16-23)} \\
		\hline
		0 & 0 & 0 & 0 & 0 & 0 & 0 & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & 0 &
		\multicolumn{1}{|c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} &
		\multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} &
		1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\
		\hline
		\multicolumn{16}{|c|}{Base address (Bit 0-15)} &
		\multicolumn{16}{|c|}{Segment Limit (Bit 0-15)} \\
		\hline
	\end{tabular}
}
\caption{Descriptor de segmento para c\'odigo de nivel 3.}
\end{table}

\begin{table}[H]
\centering
\scalebox{0.8}{
	\begin{tabular}{|c c c c c c c c|c|c|c|c|c c c c|c|c c|c|c c c c|c c c c c c c c|}
		\hline
		\multicolumn{4}{|l}{31} & \multicolumn{4}{r|}{24} &
		\multicolumn{2}{|l}{23} & \multicolumn{2}{r|}{20} &
		\multicolumn{2}{|l}{19} & \multicolumn{2}{r|}{16} &
		\multicolumn{2}{|l}{15} & \multicolumn{2}{r|}{12} &
		\multicolumn{2}{|l}{11} & \multicolumn{2}{r|}{8} &
		\multicolumn{4}{|l}{7} & \multicolumn{4}{r|}{0} \\
		\hline
		0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &
		1 & 1 & 0 & 0 &
		0 & 1 & 1 & 1 &
		1 & 0 & 0 & 1 &
		0 & 0 & 1 & 0 &
		0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
		\hline
		\multicolumn{8}{|c|}{Base address (24-31)} &
		\multicolumn{1}{|c|}{G} &
		\multicolumn{1}{|c|}{DB} &
		\multicolumn{1}{|c|}{} &
		\multicolumn{1}{|c|}{A} &
		\multicolumn{4}{|c|}{Limit (16-19)} &
		\multicolumn{1}{|c|}{P} &
		\multicolumn{2}{|c|}{DPL} &
		\multicolumn{1}{|c|}{S} &
		\multicolumn{4}{|c|}{Type} &
		\multicolumn{8}{|c|}{Base address (16-23)} \\
		\hline
		0 & 0 & 0 & 0 & 0 & 0 & 0 & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & 0 &
		\multicolumn{1}{|c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} &
		\multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} &
		1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\
		\hline
		\multicolumn{16}{|c|}{Base address (Bit 0-15)} &
		\multicolumn{16}{|c|}{Segment Limit (Bit 0-15)} \\
		\hline
	\end{tabular}
}
\caption{Descriptor de segmento para datos de nivel 0.}
\end{table}

\begin{table}[H]
\centering
\scalebox{0.8}{
	\begin{tabular}{|c c c c c c c c|c|c|c|c|c c c c|c|c c|c|c c c c|c c c c c c c c|}
		\hline
		\multicolumn{4}{|l}{31} & \multicolumn{4}{r|}{24} &
		\multicolumn{2}{|l}{23} & \multicolumn{2}{r|}{20} &
		\multicolumn{2}{|l}{19} & \multicolumn{2}{r|}{16} &
		\multicolumn{2}{|l}{15} & \multicolumn{2}{r|}{12} &
		\multicolumn{2}{|l}{11} & \multicolumn{2}{r|}{8} &
		\multicolumn{4}{|l}{7} & \multicolumn{4}{r|}{0} \\
		\hline
		0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &
		1 & 1 & 0 & 0 &
		0 & 1 & 1 & 1 &
		1 & 1 & 1 & 1 &
		0 & 0 & 1 & 0 &
		0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
		\hline
		\multicolumn{8}{|c|}{Base address (24-31)} &
		\multicolumn{1}{|c|}{G} &
		\multicolumn{1}{|c|}{DB} &
		\multicolumn{1}{|c|}{} &
		\multicolumn{1}{|c|}{A} &
		\multicolumn{4}{|c|}{Limit (16-19)} &
		\multicolumn{1}{|c|}{P} &
		\multicolumn{2}{|c|}{DPL} &
		\multicolumn{1}{|c|}{S} &
		\multicolumn{4}{|c|}{Type} &
		\multicolumn{8}{|c|}{Base address (16-23)} \\
		\hline
		0 & 0 & 0 & 0 & 0 & 0 & 0 & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & 0 &
		\multicolumn{1}{|c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} &
		\multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} &
		1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\
		\hline
		\multicolumn{16}{|c|}{Base address (Bit 0-15)} &
		\multicolumn{16}{|c|}{Segment Limit (Bit 0-15)} \\
		\hline
	\end{tabular}
}
\caption{Descriptor de segmento para datos de nivel 3.}
\end{table}

\begin{table}[H]
\centering
\scalebox{0.8}{
	\begin{tabular}{|c c c c c c c c|c|c|c|c|c c c c|c|c c|c|c c c c|c c c c c c c c|}
		\hline
		\multicolumn{4}{|l}{31} & \multicolumn{4}{r|}{24} &
		\multicolumn{2}{|l}{23} & \multicolumn{2}{r|}{20} &
		\multicolumn{2}{|l}{19} & \multicolumn{2}{r|}{16} &
		\multicolumn{2}{|l}{15} & \multicolumn{2}{r|}{12} &
		\multicolumn{2}{|l}{11} & \multicolumn{2}{r|}{8} &
		\multicolumn{4}{|l}{7} & \multicolumn{4}{r|}{0} \\
		\hline
		0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &
		0 & 1 & 0 & 0 &
		0 & 0 & 0 & 0 &
		1 & 0 & 0 & 1 &
		0 & 0 & 1 & 0 &
		0 & 0 & 0 & 0 & 1 & 0 & 1 & 1 \\
		\hline
		\multicolumn{8}{|c|}{Base address (24-31)} &
		\multicolumn{1}{|c|}{G} &
		\multicolumn{1}{|c|}{DB} &
		\multicolumn{1}{|c|}{} &
		\multicolumn{1}{|c|}{A} &
		\multicolumn{4}{|c|}{Limit (16-19)} &
		\multicolumn{1}{|c|}{P} &
		\multicolumn{2}{|c|}{DPL} &
		\multicolumn{1}{|c|}{S} &
		\multicolumn{4}{|c|}{Type} &
		\multicolumn{8}{|c|}{Base address (16-23)} \\
		\hline
		1 & 0 & 0 & 0 & 0 & 0 & 0 & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & 0 &
		\multicolumn{1}{|c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} & \multicolumn{1}{c}{0} &
		\multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{1} &
		1 & 0 & 0 & 1 & 1 & 1 & 1 & 1 \\
		\hline
		\multicolumn{16}{|c|}{Base address (Bit 0-15)} &
		\multicolumn{16}{|c|}{Segment Limit (Bit 0-15)} \\
		\hline
	\end{tabular}
}
\caption{Descriptor de segmento para datos de video.}
\end{table}

En los cuatro primeros casos, el l\'imite es 2GB - 1 (contamos el 0) y por lo tanto los 20 bits son \texttt{0x7FFFF}, y la
base es 0. Para que pueda llegar al l\'imite de 2GB es necesario activar el bit de Granularity (G) para que la unidad direccionable sea de 4Kb.
En el caso del video, el l\'imite es 80 col x 25 filas x 2 bytes por elemento - 1 (contamos el 0) y por lo tanto
los 20 bits son \texttt{0x00F9F}, mientras que la base de la memoria de video es en el segmento \texttt{0xB8000} y no es necesario activar G para llegar a ese valor de direcci\'on.
Los descriptores de c\'odigo tienen tipo \texttt{0xA} (Code: Execute/Read) mientras que los de dato tienen tipo \texttt{0x2}
(Data: Read/Write). Para los descriptores de segmento de Nivel 3 se sete\'o DPL en 3 (0x11) y para los descriptores de Nivel 0 el DPL en 0 (0x00).\\
Para todos los descriptores se puso 1 en el bit de Presente (P) para indicar que el descriptor esta presente y el bit de Sistema en 1 (que indica que NO es de sistema, es decir que es de tipo c\'odigo o dato). Tambi\'en para todos los descriptores se sete\'o el bit de DB que indica que el segmento es de 32 bits.
\\
\\
\hspace*{10pt}
Finalmente, antes de cargar la GDT en el archivo {\bf kernel.asm} debemos deshabilitar, chequear, habilitar y volver a chequear
\texttt{A20} para poder direccionar direcciones sobre MB de memoria y, luego, deshabilitar las interrupciones a trav\'es de la instrucci\'on {\bf cli}.
Luego alcanza con llamar a {\bf lgdt [GDT{\textunderscore}DESC]} y el sistema ya tendr\'a cargada la GDT inicializada.

\subsubsection{Modo Protegido}
Pasar al modo protegido es una tarea sencilla despues de haber cargardo correctamente la GDT: alcanza con setear el bit PE del registro {\bf cr0}.
Luego, queremos que {\bf CS} vaya a \texttt{0x50} (\'Indice A de GDT) (C\'odigo Nivel 0), por lo que realizamos un
\texttt{jump 0x50:mp} con el selector de segmento \{index: A $|$ gdt: 0 $|$ rpl: 00\}.
\\
\hspace*{10pt}
Despu\'es procedemos a configurar los registros {\bf ds, es, gs, ss} y {\bf fs} asignando a los cuatro primeros el valor
\texttt{1100000b} (selector de segmento de datos de la ubicaci\'on 12 \{index: C $|$ gdt: 0 $|$ rpl: 00\}), y
al {\bf fs} el valor \texttt{1110000b} (selector de segmento de video de la ubicaci\'on 14 \{index: E $|$ gdt: 0 $|$ rpl: 00\}).
\\
\hspace*{10pt}
Finalmente, asignamos a los registros {\bf ebp} y {\bf esp} el valor \texttt{0x21000} para que la pila est\'e en la posici\'on
\texttt{0x20000} dado que la pila se recorre al rev\'es.

\subsubsection{Pantalla}
Para terminar el ejercicio procedemos a limpiar toda la pantalla pint\'andola de color gris, para luego pintar la primer y
\'ultima filas de color negro. Para pintar la pantalla de gris sabemos que la pantalla tiene 80 columnas y 25 filas donde cada elemento ocupa 2 Bytes. C\'omo en el registro FS hab\'iamos puesto el descriptor de segmento de la memoria de video vamos recorriendo la misma modificando el offset hasta llegar al l\'imite y pintando del color deseado todo el mapa de memoria de video.
A continuaci\'on mostramos la pantalla al finalizar el ejercicio.
	
\begin{figure}[H]
	\centering
	\includegraphics[scale=0.5]{Images/ej1.png}
	\centering
	\label{fig_ej1}
\end{figure}
